const { body, param, query } = require('express-validator');

/**
 * 创建轮播图验证规则
 */
exports.createBannerValidation = [
  body('title')
    .notEmpty()
    .withMessage('轮播图标题不能为空')
    .isLength({ min: 1, max: 100 })
    .withMessage('标题长度必须在1-100个字符之间')
    .trim(),

  body('image')
    .notEmpty()
    .withMessage('轮播图图片不能为空')
    .custom((value) => {
      // 检查是否是有效的URL或相对路径
      if (value.startsWith('http://') || value.startsWith('https://') || value.startsWith('/uploads/')) {
        return true;
      }
      throw new Error('图片必须是有效的URL地址或上传路径');
    })
    .trim(),

  body('link')
    .optional()
    .trim()
    .isLength({ max: 500 })
    .withMessage('链接长度不能超过500个字符'),

  body('linkType')
    .optional()
    .isIn(['product', 'category', 'shop', 'external', 'none'])
    .withMessage('链接类型必须是: product, category, shop, external, none 中的一个'),

  body('linkTarget')
    .optional()
    .trim()
    .isLength({ max: 200 })
    .withMessage('链接目标长度不能超过200个字符'),

  body('order')
    .optional()
    .isInt({ min: 0 })
    .withMessage('排序值必须是大于等于0的整数'),

  body('isActive')
    .optional()
    .isBoolean()
    .withMessage('状态必须是布尔值'),

  body('startDate')
    .optional()
    .isISO8601()
    .withMessage('开始时间必须是有效的日期格式'),

  body('endDate')
    .optional()
    .isISO8601()
    .withMessage('结束时间必须是有效的日期格式')
    .custom((value, { req }) => {
      if (value && req.body.startDate) {
        const startDate = new Date(req.body.startDate);
        const endDate = new Date(value);
        if (endDate <= startDate) {
          throw new Error('结束时间必须晚于开始时间');
        }
      }
      return true;
    }),

  body('description')
    .optional()
    .trim()
    .isLength({ max: 500 })
    .withMessage('描述长度不能超过500个字符'),

  body('platform')
    .optional()
    .isIn(['mobile', 'web', 'all'])
    .withMessage('平台类型必须是: mobile, web, all 中的一个')
];

/**
 * 更新轮播图验证规则
 */
exports.updateBannerValidation = [
  param('id')
    .isMongoId()
    .withMessage('无效的轮播图ID'),

  body('title')
    .optional()
    .notEmpty()
    .withMessage('轮播图标题不能为空')
    .isLength({ min: 1, max: 100 })
    .withMessage('标题长度必须在1-100个字符之间')
    .trim(),

  body('image')
    .optional()
    .notEmpty()
    .withMessage('轮播图图片不能为空')
    .isURL()
    .withMessage('图片必须是有效的URL地址')
    .trim(),

  body('link')
    .optional()
    .trim()
    .isLength({ max: 500 })
    .withMessage('链接长度不能超过500个字符'),

  body('linkType')
    .optional()
    .isIn(['product', 'category', 'shop', 'external', 'none'])
    .withMessage('链接类型必须是: product, category, shop, external, none 中的一个'),

  body('linkTarget')
    .optional()
    .trim()
    .isLength({ max: 200 })
    .withMessage('链接目标长度不能超过200个字符'),

  body('order')
    .optional()
    .isInt({ min: 0 })
    .withMessage('排序值必须是大于等于0的整数'),

  body('isActive')
    .optional()
    .isBoolean()
    .withMessage('状态必须是布尔值'),

  body('startDate')
    .optional()
    .isISO8601()
    .withMessage('开始时间必须是有效的日期格式'),

  body('endDate')
    .optional()
    .isISO8601()
    .withMessage('结束时间必须是有效的日期格式')
    .custom((value, { req }) => {
      if (value && req.body.startDate) {
        const startDate = new Date(req.body.startDate);
        const endDate = new Date(value);
        if (endDate <= startDate) {
          throw new Error('结束时间必须晚于开始时间');
        }
      }
      return true;
    }),

  body('description')
    .optional()
    .trim()
    .isLength({ max: 500 })
    .withMessage('描述长度不能超过500个字符'),

  body('platform')
    .optional()
    .isIn(['mobile', 'web', 'all'])
    .withMessage('平台类型必须是: mobile, web, all 中的一个')
];

/**
 * 获取轮播图详情验证规则
 */
exports.getBannerValidation = [
  param('id')
    .isMongoId()
    .withMessage('无效的轮播图ID')
];

/**
 * 删除轮播图验证规则
 */
exports.deleteBannerValidation = [
  param('id')
    .isMongoId()
    .withMessage('无效的轮播图ID')
];

/**
 * 批量删除轮播图验证规则
 */
exports.batchDeleteBannersValidation = [
  body('ids')
    .isArray({ min: 1 })
    .withMessage('请提供要删除的轮播图ID列表')
    .custom((ids) => {
      const mongoose = require('mongoose');
      const invalidIds = ids.filter(id => !mongoose.Types.ObjectId.isValid(id));
      if (invalidIds.length > 0) {
        throw new Error('包含无效的轮播图ID');
      }
      return true;
    })
];

/**
 * 更新轮播图状态验证规则
 */
exports.updateBannerStatusValidation = [
  param('id')
    .isMongoId()
    .withMessage('无效的轮播图ID'),

  body('isActive')
    .isBoolean()
    .withMessage('状态必须是布尔值')
];

/**
 * 获取轮播图列表验证规则
 */
exports.getBannersValidation = [
  query('keyword')
    .optional()
    .trim()
    .isLength({ max: 100 })
    .withMessage('关键词长度不能超过100个字符'),

  query('platform')
    .optional()
    .isIn(['mobile', 'web', 'all', ''])
    .withMessage('平台类型必须是: mobile, web, all 中的一个'),

  query('isActive')
    .optional()
    .isIn(['true', 'false', ''])
    .withMessage('状态必须是: true, false 中的一个'),

  query('page')
    .optional()
    .isInt({ min: 1 })
    .withMessage('页码必须是大于0的整数'),

  query('limit')
    .optional()
    .isInt({ min: 1, max: 100 })
    .withMessage('每页数量必须是1-100之间的整数'),

  query('sort')
    .optional()
    .isIn(['createdAt', '-createdAt', 'order', '-order', 'clickCount', '-clickCount'])
    .withMessage('排序字段无效')
];

/**
 * 记录点击验证规则
 */
exports.recordClickValidation = [
  param('id')
    .notEmpty()
    .withMessage('轮播图ID不能为空')
];

/**
 * 获取统计信息验证规则
 */
exports.getBannerStatsValidation = [
  query('startDate')
    .optional()
    .isISO8601()
    .withMessage('开始时间必须是有效的日期格式'),

  query('endDate')
    .optional()
    .isISO8601()
    .withMessage('结束时间必须是有效的日期格式')
    .custom((value, { req }) => {
      if (value && req.query.startDate) {
        const startDate = new Date(req.query.startDate);
        const endDate = new Date(value);
        if (endDate <= startDate) {
          throw new Error('结束时间必须晚于开始时间');
        }
      }
      return true;
    })
];
